#include "binarysearch.h"

// 构造函数：接收一个整数数组，排序后存入 bars，用于可视化展示
BinarySearch::BinarySearch(const QVector<int>& values)
    : low(0), high(values.size() - 1), target(-1), found(false), finished(false), foundIndex(-1), compareCount(0) {
    QVector<int> sortedValues = values;
    std::sort(sortedValues.begin(), sortedValues.end());
    for (int v : sortedValues) bars.append({v, Qt::lightGray});
}

// 单步执行查找逻辑
void BinarySearch::step() {
    // 查找已完成或区间非法，标记为完成
    if (finished || low > high) {
        finished = true;
        return;
    }

    // 重置颜色
    for (auto& bar : bars) bar.color = Qt::lightGray;

    // 计算中间索引
    mid = low + (high - low) / 2;
    bars[mid].color = Qt::red;
    compareCount++;

    // 若找到目标值，标记绿色并完成
    if (bars[mid].value == target) {
        bars[mid].color = Qt::green;
        found = true;
        foundIndex = mid;
        finished = true;
    }
    // 若中间值大于目标值，缩小右边界
    else if (bars[mid].value > target) {
        high = mid - 1;
    }
    // 若中间值小于目标值，缩小左边界
    else {
        low = mid + 1;
    }
}

// 返回是否查找完成
bool BinarySearch::isFinished() const { return finished; }

// 获取当前可视化数据（包含颜色信息）
const QVector<SortBar>& BinarySearch::getData() const { return bars; }

// 设置目标查找值
void BinarySearch::setTarget(int value) { target = value; }

// 返回是否成功找到目标
bool BinarySearch::isFound() const { return found; }

// 返回找到目标的索引位置
int BinarySearch::getFoundIndex() const { return foundIndex; }

// 返回算法文字描述
QString BinarySearch::getDescription() const {
    return "二分查找：在有序数据中折半查找目标值，每步缩小一半范围。";
}

// 返回比较次数并清零
int BinarySearch::getAndResetCompareCount() {
    int c = compareCount;
    compareCount = 0;
    return c;
}
